package br.com.sgp.util.handling;

import org.apache.log4j.Logger;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;

import br.com.sebrae.pr.sgp.util.exceptions.ExcecaoDeApresentacao;
import br.com.sebrae.pr.sgp.util.exceptions.TipoErro;
import br.com.sebrae.pr.sgp.util.exceptions.TratadorDeExcecoes;
import br.com.ufpr.util.base.BasePage;

public abstract class ErrorHandlingAjaxLink extends IndicatingAjaxLink<Void> {
    private static final long serialVersionUID = 1569617672157429696L;

    private static final Logger log = Logger.getLogger(ErrorHandlingAjaxLink.class);
    private Object item;
    
    public ErrorHandlingAjaxLink(final String id) {
        super(id);
    }
    
    public ErrorHandlingAjaxLink(final String id, Object item) {
        super(id);
        this.item = item;
    }

    @Override
    public final void onClick(final AjaxRequestTarget target) {

        try {
            log.debug("Iniciando click ajax.");
            onClicked(target);
            onSucesso(target);
            log.debug("Término da exucução do click ajax.");

        } catch (Exception e) {
            TratadorDeExcecoes.logaException("Erro no click ajax...", e);
            onErro(target);

            final ExcecaoDeApresentacao ea = TratadorDeExcecoes.convertException(e);
            ((BasePage) ErrorHandlingAjaxLink.this.getPage()).adicionaMensagem(ea.getTipoErro() != null ? ea.getTipoErro() : TipoErro.ERRO,
                    ea.getMensagem());
            ((BasePage) ErrorHandlingAjaxLink.this.getPage()).atualizarFeedbackPanel();
        }
    }

    protected void onSucesso(final AjaxRequestTarget target) {
    }

    protected void onErro(final AjaxRequestTarget target) {
    }

    protected abstract void onClicked(final AjaxRequestTarget target);

}
